昨天大家都看到,當在寫文章時使用上傳圖片,圖片就會先預先上傳到後端來。
這時候我們就要開始建立如何處理圖片的程式碼。
建立處理圖片的商務邏輯,像是圖片大小、儲存地方等等,這些算是商務邏輯,
所以會建立一個介面和他的實作。
這邊會利用到DI的技巧與觀念。
可以理解成處理圖片這個動作是寫在一個function裡面,而這個function就像一個工具。
ArticleController.cs 這個檔案要使用這個工具前,需要先跟系統申請說,我需要這一個工具,
而這個申請的行為就是DI(相依性注入)
目標:
1.建立介面與實作
2.跟系統註冊這個工具(介面)
步驟:
step1.建立三個檔案
1.在Applications/ArticleService/Models路徑底下建立ImageUploadResponse.cs 用來裝上傳圖片的結果。
public class ImageUploadResponse
{
public int Uploaded { get; set; }
public string FileName { get; set; } = string.Empty;
public string Url { get; set; } = string.Empty;
public string Msg { get; set; } = string.Empty;
}
2.IArticleService.cs 定義介面(這是全部都會用到的方法,會出錯的話,可以先把還沒實作的先註解)。
public interface IArticleService
{
Task<ImageUploadResponse> UploadImage(IFormFile upload);
Task CreateArticle(string content);
Task UpdateArticle(UpdateArticleViewModel model);
Task<IList<Article>> GetArticle(long? id);
Task<IList<Article>> GetUpdateArticle(long? id);
}
3.ArticleService.cs 實作文章的商務邏輯。
public async Task<ImageUploadResponse> UploadImage(IFormFile upload)
{
if (upload.Length <= 0) return null!;
var fileName = Guid.NewGuid() + Path.GetExtension(upload.FileName).ToLower();
var filePath = Path.Combine(
Directory.GetCurrentDirectory(), "wwwroot/images",
fileName);
using (var stream = File.Create(filePath))
{
//程式寫入的本地資料夾裡面
await upload.CopyToAsync(stream);
}
var url = $"{"/images/"}{fileName}";
var reslult = new ImageUploadResponse
{
Uploaded = 1,
FileName = fileName,
Url = url,
Msg = "sucess",
};
return reslult;
}
step2.跟系統註冊這項服務,想到註冊就要想到program.cs,然後跟系統註冊你的工具。
// 註冊客製化介面
builder.Services.AddTransient<IArticleService, ArticleService>();
做到這裏後,再執行,上傳圖片後應該就會看到有新增圖片了